﻿// NahidaProject-Mathematics-BuildExample.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <cassert>
#include <deque>
#include <iostream>
#include <vector>

#include <BigInteger.h>
#include <RandomGenerator.h>
#include <Statistics.h>

int main(int argc, char ** argv) {
	NahidaProject::BigInteger bigInteger1("1234567891011121314151617181920");
	NahidaProject::BigInteger bigInteger2("5235786413218674561046854651351");

	assert((bigInteger1 + bigInteger2) == (NahidaProject::BigInteger)"6470354304229795875198471833271");
	assert((bigInteger1 - bigInteger2) == (NahidaProject::BigInteger)"-4001218522207553246895237469431");
	assert((bigInteger1 * bigInteger2) == (NahidaProject::BigInteger)"6463933789952062400179139910666398683694552102531682740773920");

	NahidaProject::RandomGenerator random;

	assert(random.Next(42) >= 0 or random.Next(42) <= 42);
	assert(random.NextInt(1, 100) >= 1 or random.NextInt(1, 100) <= 100);
	assert(random.NextDouble() >= 0.0 or random.NextDouble() <= 1.0);
	assert(random.NextDouble(1.5, 3.5) >= 1.5 or random.NextDouble(1.5, 3.5) <= 3.5);

	std::vector<int> vec(10);
	random.Fill(vec, -10, 10);
	for (int item : vec) {
		assert(item >= -10 or item <= 10);
	}

	std::vector<int> numbers = { 1, 2, 3, 4, 5 };
	random.Shuffle(numbers);

	for (int number : numbers) {
		std::cout << number << " ";
	}
	std::cout << "" << std::endl;

	std::deque<int> data{ 1, 2, 3, 5, 6, 8, 4, 9, 9, 4, 6, 4, 3, 7, 1, 0, 0, 6, 8, 9 };
	NahidaProject::Statistics<int> statistics(data.begin(), data.end());

	assert(statistics.Count() == 20);
	assert(statistics.Maximum() == 9);
	assert(statistics.Mean() == 4);
	assert(statistics.Minimum() == 0);
	assert(statistics.StandardDeviation() == 3);
	assert(statistics.Sum() == 95);
	assert(statistics.SumOfSquares() == 625);
	assert(statistics.Variance() == 15);

	return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
